package com.such.kit.web.jwt.bean;

import java.util.List;
import org.jose4j.jwt.JwtClaims;
import org.jose4j.jwt.consumer.ErrorCodeValidator;
import org.jose4j.jwt.consumer.ErrorCodes;
import org.jose4j.jwt.consumer.InvalidJwtException;

/**
 * @author SUCH
 * <pre>
 * token 验证结果
 * 基于 {@link InvalidJwtException} 扩展
 * </pre>
 */
public class ValidateResult {

	private boolean authenticate;
	private JwtClaims jwtClaims;
	private InvalidJwtException exception;

	/**
	 * <pre>
	 * {@link #authenticate} 默认为 true
	 * </pre>
	 * @param jwtClaims
	 */
	public ValidateResult(JwtClaims jwtClaims) {
		this.authenticate = true;
		this.jwtClaims = jwtClaims;
	}

	/**
	 * <pre>
	 * {@link #authenticate} 默认为 false
	 * </pre>
	 * @param exception
	 */
	public ValidateResult(InvalidJwtException exception) {
		this.authenticate = false;
		this.exception = exception;
	}

	/**
	 * <pre>
	 * 是否认证
	 * </pre>
	 * @return true 为已认证
	 */
	public boolean authenticated() {
		return this.authenticate;
	}

	/**
	 * <pre>
	 * 从 {@link InvalidJwtException} 中检查令牌是否失效
	 * </pre>
	 * @return true 为失效
	 */
	public boolean expired() {
		if (authenticated()) {
			return false;
		} else {
			return exception.hasExpired();
		}
	}

	/**
	 * <pre>
	 * 从 {@link InvalidJwtException} 中检查是否有指定错误码
	 * </pre>
	 * @param code 错误码 [参考 {@link ErrorCodes}]
	 * @return true 为有错误码
	 */
	public boolean hasErrorCode(int code) {
		if (authenticated()) {
			return false;
		} else {
			return exception.hasErrorCode(code);
		}
	}

	/**
	 * <pre>
	 * 从 {@link InvalidJwtException} 中获取错误明细
	 * </pre>
	 * @return
	 */
	public List<ErrorCodeValidator.Error> getErrorDetails() {
		if (authenticated()) {
			return null;
		} else {
			return exception.getErrorDetails();
		}
	}

	/**
	 * <pre>
	 * 获取 payload
	 * </pre>
	 * @return payload
	 */
	public JwtClaims getJwtClaims() {
		if (authenticated()) {
			return this.jwtClaims;
		} else {
			return exception.getJwtContext().getJwtClaims();
		}
	}

	/**
	 * <pre>
	 * 从 {@link InvalidJwtException} 中获取错误信息
	 * </pre>
	 * @return 错误信息
	 */
	public String getMessage() {
		if (authenticated()) {
			return null;
		} else {
			return exception.getMessage();
		}
	}

}
